package base.ioput;

import java.io.*;

public class BufferedReaderDemo {

    public static void main(String[] args) throws IOException {

    }


    public static void bufferedFileRead() throws IOException {
        //创建一个读取流对象和文件相关联。
        FileReader fr = new FileReader("buf.txt");

        //为了提高效率。加入缓冲技术。将字符读取流对象作为参数传递给缓冲对象的构造函数。
        BufferedReader bufr = new BufferedReader(fr);


        String line = null;

        //达到流的末尾是空（null）
        while ((line = bufr.readLine()) != null) {
            System.out.print(line);
        }

        bufr.close();

    }


    public static void myBufferedFileReader() throws IOException {

        FileReader fr = new FileReader("buf.txt");

        MyBufferedReader myBuf = new MyBufferedReader(fr);

        String line = null;

        while ((line = myBuf.myReadLine()) != null) {
            System.out.println(line);
        }
        myBuf.myClose();
    }

    /**
     * 仿写bufferedReader ,相当于对Reader的一种装饰
     */
    static class MyBufferedReader extends Reader {

        private Reader r;

        MyBufferedReader(Reader r) {
            this.r = r;
        }

        //可以一次读一行数据的方法。
        public String myReadLine() throws IOException {
            //定义一个临时容器。原BufferReader封装的是字符数组。
            //为了演示方便。定义一个StringBuilder容器。因为最终还是要将数据变成字符串。
            StringBuilder sb = new StringBuilder();
            int ch = 0;
            while ((ch = r.read()) != -1) {
                if (ch == '\r')
                    continue;
                if (ch == '\n')
                    return sb.toString();
                else
                    sb.append((char) ch);
            }

            if (sb.length() != 0)
                return sb.toString();
            return null;
        }

        /*
        覆盖Reader类中的抽象方法。

        */
        public int read(char[] cbuf, int off, int len) throws IOException {
            return r.read(cbuf, off, len);
        }

        public void close() throws IOException {
            r.close();
        }

        public void myClose() throws IOException {
            r.close();
        }
    }


}
